package main

import (
	"fmt"
	"github.com/samuel/go-zookeeper/zk"
	"log"
	"time"
)

func main() {

	//指定服务列表(不能是IP只能写主机名,本地配置hosts映射)
	strs := []string{"node01:2181", "node02:2181", "node03:2181"}

	//获取连接
	conn := getConn(strs)

	//创建节点
	var path = "/test01"
	var data = []byte("hello zk")
	/*
	0 代表永久节点
	1 临时节点
	2 有序节点
	3 临时有序节点
	 */
	var flags int32 = 0
	createNode(conn, path, data, flags)

	//查看目录下的所有节点
	children, _, err := conn.Children("/")
	CheckErr(err)
	fmt.Printf("%v \n", children)

	//获取节点信息
	data, stat, err := conn.Get("/test")
	CheckErr(err)
	fmt.Printf("获得节点：%v %v\n", string(data), stat)

	//节点修改值
	stat, err = conn.Set("/test", []byte("newdate"), stat.Version)
	CheckErr(err)
	fmt.Println("节点修改成功")

	//删除节点
	err = conn.Delete("/test", stat.Version)
	CheckErr(err)
	fmt.Println("删除节点成功")

	//节点是否存在
	bol, stat, err := conn.Exists("/test")
	CheckErr(err)
	fmt.Printf("exists: %v %v \n", bol, stat)
}

func getConn(strings []string) *zk.Conn {
	//参数： 服务列表和超时时间
	conn, _, err := zk.Connect(strings, time.Second*5)
	CheckErr(err)
	return conn
}

func CheckErr(err error) {
	if err != nil {
		log.Fatal(err)
	}
}

func createNode(conn *zk.Conn, path string, data []byte, flags int32) {
	//创建节点
	path, err := conn.Create(path, data, flags, zk.WorldACL(zk.PermAll))
	CheckErr(err)
	fmt.Println("创建了新节点：", path)
}
